﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include "GcmpModelInterface.h"
#include "INoElementIdDbObject.h"
#include "RegenDataId.h"

namespace gcmp
{
    class Coordinate3d;

    /// \brief 对象位置报告组件的接口
    ///
    /// 定位对象（如标高、工作平面等），需要报告自身的位置（如坐标系、高度等）。
    class GCMP_MODEL_INTERFACE_EXPORT IElementPositionReportComponent : public INoElementIdDbObject
    {
        DEFINE_CAST_DERIVED(gcmp::IElementPositionReportComponent, gcmp::INoElementIdDbObject)

    public:
        /// \brief 生成空的位置报告组件的实现
        ///
        /// 没有具体的位置报告逻辑
        /// \param pElement 接口所属的对象
        /// \return 返回一个接口的指针。
        static OwnerPtr<IElementPositionReportComponent> CreateNullPositionReportComponent();

        /// \brief 获取定位对象的三维坐标系
        /// \param coord 输出参数，定位对象的三维坐标系
        /// \return true-获取成功；false-获取失败
        virtual bool GetCoordinate3d(Coordinate3d& coord) const = 0;

        /// \brief 获取定位对象的高度
        /// \param height 输出参数，定位对象的高度
        /// \return true-获取成功；false-获取失败
        virtual bool GetHeight(double& height) const = 0;

        /// \brief 报告参照平面的关联更新变化Id
        ///
        /// 若对象中包含参照平面，需要重写该接口报出参照平面的关联更新变化Id
        /// \param dataIds 输出参数，参照平面的关联更新变化Id（只允许累加，不允许删除或清空）
        /// \return true-成功；false-失败
        virtual bool GetReferencePlaneRdId(std::vector<RegenDataId>& dataIds) const = 0;
    };
}

